#include <iostream>
#include <string>

using namespace std;

class A
{
protected:
    int x;
public:
    // 默认调用无参的构造函数
    A() {
        cout << "A()" << endl;
    }
    A(int a) 
    :x(a)
    {
        cout << "A(int)" << endl;
    }
    ~A() {
        cout << "~A()" << endl;
    }

    // 虚函数
    // 1.有默认实现
    // 2.被子类重写（覆盖）
    virtual void show()
    {
        cout << "-----A------" << endl;
        cout << "x = " << x << endl;
    }
};

// B继承A
// 关系：is a
class B : public A
{
private:
public:
    int y;
    B()
    :A() 
    {
        cout << "B()" << endl;
    }
    ~B() {
        cout << "~B()" << endl;
    }
    // override 目的检查函数签名在父类中是否存在是否一致
    void show() override
    {
        // 调用父类的同名方法
        A::show();
        cout << "------B------" << endl;
        cout << "x =" << x << endl;
        cout << "y =" << y << endl;
    }
};

class C : public B
{
private:
public:
    int z;
    C() {
        cout << "C()" << endl;
    }
    ~C() {
        cout << "~C()" << endl;
    }
};

int main(int argc, char const *argv[])
{
    // A o1;
    // o1.x = 1;

    // B o2;
    // o2.x = 10;  //继承A
    // o2.y = 100; //B自己拥有的
    
    // C o3;
    // o3.x = 1;
    // o3.y = 1;
    // o3.z = 1;
    return 0;
}
